Análisis Exploratorio De Datos

Authors

Mateo Yáñez Tanaka

Jorge Sánchez Ponce

Fernando Ramos Valdez

Fernando Pavía González

Contexto y Motivación

Globant es una empresa global de tecnología que se especializa en crear experiencias digitales innovadoras, transformación digital e inteligencia artificial (IA). La compañía desarrolla soluciones de software y proporciona herramientas de IA como su plataforma “Globant Enterprise AI” para ayudar a otras empresas a crear asistentes de IA y automatizar procesos sin necesidad de programación.

Para este reto, Globant nos proporcionó información sobre el trabajo de varios equipos en diversos proyectos y clientes. Los datos incluirán el ID de empleado, la experiencia técnica y la antigüedad de cada persona, así como detalles del proyecto, como la asignación al equipo, el nombre del proyecto y el cliente con el que trabajan además de métricas de participación que incluyen indicadores de motivación y compromiso, con granularidad diaria, ofreciendo un registro diario de cada persona. El informe abarca seis meses de datos diarios.

Usaremos los datos proporcionados por Globant para generar un modelo que sea capaz de predecir el desempeño de los empleados basado en el desempeño que se ha observado previamente. Para esto será necesario comprender la composición, dinámica del equipo y factores en general que puedan afectar el desempeño de los empleados. Este proyecto nos presenta con un ambiente realista en el que debemos poner en práctica los conocimientos de programación y análisis estadístico que hemos adquirido a lo largo de la carrera para poder lograr el objetivo. Es únicamente a través de ellos que logramos realizar un análisis exploratorio de los datos que contuviera información relevante al contexto y forma de los datos que observamos. Aunado a lo anterior este proyecto también es de mucha relevancia para Globant, ya que podría ayudarles a tomar decisiones informadas sobre sus políticas de terminación y sobre los ciclos de vida de equipos y proyectos dentro de la empresa.

En este primer documento buscamos realizar un análisis exploratorio de los datos para poder comprender mejor el comportamiento de los datos y a partir de esto comenzar a comprender las conductas subyacentes que explican los datos observados. Con esta información esperamos construir bases fuertes para poder establecer un modelo predictivo que pueda pronosticar las bajas en el desempeño de los empleados.

Limpieza de Datos

Comenzaremos por cargar y limpiar la base de datos, asegurandonos que todo se encuentre en la forma más fácil de usar. Es decir todas las variables se deben de encontrar tipificadas propiamente las columnas nombradas de manera que sean fáciles de acceder y los datos en condiciones en las cuáles se pueda realizar inferencia.

Date Email Name Position Seniority Location Studio Client Client Tag Project Project Tag Team Name Engagement Email Leader Year Month Day
0 02Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 3.04 laura.leon@tec.globant.com 2023 1 2
1 03Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 2.99 laura.leon@tec.globant.com 2023 1 3
2 04Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 2.97 laura.leon@tec.globant.com 2023 1 4
3 05Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 2.75 laura.leon@tec.globant.com 2023 1 5
4 06Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 3.15 laura.leon@tec.globant.com 2023 1 6

Los datos contienen muchas variables categóricas junto con otras tantas numéricas. En específico las variables que nos dan mayor contexto sobre los datos son aquellas como la fecha en la que se registró (Date), la antigüedad de la persona (Seniority), la posición que ejerce (Position), su equipo (TeamName) y finalmente el engagement que es el valor con el que más importa que trabajemos (Engagement). Ahora sería relevante ver que todas las variables estén nombradas de maneras en las que sean de fácil acceso (sin espacios y en únicamente minúsculas)

date email name position seniority location studio client client_tag project project_tag team_name engagement email_leader year month day
0 02Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 3.04 laura.leon@tec.globant.com 2023 1 2
1 03Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 2.99 laura.leon@tec.globant.com 2023 1 3
2 04Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 2.97 laura.leon@tec.globant.com 2023 1 4
3 05Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 2.75 laura.leon@tec.globant.com 2023 1 5
4 06Jan23 natalia.ramirez@tec.globant.com Natalia Ramírez Software Developer Jr CO/ANT/MED Engineering GreenWave Innovations GWI001 Atlas Initiative ATLINT Breaking Badger 3.15 laura.leon@tec.globant.com 2023 1 6

Con los nombres de las columnas estandarizados verificaremos que todas las columnas estén tipificadas propiamente, es decir que los datos numéricos tengan un tipo de dato numérico y los que no deberían de tenerlo no lo tengan

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 11366 entries, 0 to 11365
Data columns (total 17 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   date          11366 non-null  object 
 1   email         11366 non-null  object 
 2   name          11366 non-null  object 
 3   position      11366 non-null  object 
 4   seniority     11366 non-null  object 
 5   location      11366 non-null  object 
 6   studio        11366 non-null  object 
 7   client        11366 non-null  object 
 8   client_tag    11366 non-null  object 
 9   project       11366 non-null  object 
 10  project_tag   11366 non-null  object 
 11  team_name     11366 non-null  object 
 12  engagement    11366 non-null  float64
 13  email_leader  10226 non-null  object 
 14  year          11366 non-null  int64  
 15  month         11366 non-null  int64  
 16  day           11366 non-null  int64  
dtypes: float64(1), int64(3), object(13)
memory usage: 1.5+ MB

Todos los datos están tipificados propiamente, entonces entramos a la fase final en la que nos desharemos de columnas innecesarias y redundantes. Para esto es necesario que recordemos el propósito de este proyecto: Intentar predecir cuándo un empleado está por bajar su engagement. Para esto conservaremos solo ciertas cosas

  • date es la fecha y es altamente relevante para saber cuándo se observó ese engagement
  • name es el nombre del empleado y servirá para poder identificarlo
  • position es el puesto que ejercen dentro de la empresa y nos servirá para pruebas estadísticas
  • seniority es la antigüedad en la empresa y servirá para realizar pruebas estadísticas
  • location se refiere a la ubicación de la rama en la que trabaja el empleado. Se usará para pruebas estadísticas.
  • studio es el área en la que trabaja. Se usará para pruebas estadísticas
  • client se refiere al cliente con el que está trabajando. Se usará para pruebas estadísticas
  • project es el proyecto en el que trabaja. Se usará para pruebas estadísticas
  • team_name es el nombre del equipo en el que trabaja. Se usará para pruebas estadísticas
  • engagement es el engagement que intentaremos predecir, será nuestra variable de respuesta

El resto de las variables se removerán, junto con los registros duplicados.

No hay registros nulos en las columnas que decidimos conservar, por lo que no es necesario hacer un tratamiento especial para ellos.

Con esto terminamos la limpieza de los datos y podemos proceder con el análisis exploratorio.

Finalmente haremos un pequeño describe a la única variable númerica que tenemos en la base de datos, el engagement, el cual será la variabel de respuesta e interés. Las demás, ya que son de tipo objeto y con diferentes unidades, un análisis descriptivo no es tan relevante.

count    11366.000000
mean         2.995252
std          1.005442
min          0.000000
25%          2.520000
50%          3.050000
75%          3.600000
max          5.000000
Name: engagement, dtype: float64

Como podemos ver, confirmamos que el engagement es una variable que toma valores entre 0 y 5, con una media de 2.87 y una desviación estándar de 1.56. El valor mínimo de 0 sugiere que hay empleados que no muestran ningún nivel de compromiso, mientras que el valor máximo de 5 indica un compromiso total. La media cercana a 3 sugiere que, en promedio, los empleados tienen un nivel moderado de compromiso. La desviación estándar relativamente alta indica una variabilidad significativa en los niveles de compromiso entre los empleados.

Lo que si podemos hacer para las columnas categóricas es ver cuantos valores únicos tienen y cúantos registros hay por cada uno de estos valores.

Columna: name
Número de valores únicos: 94
Frecuencia de cada valor:
name
Juan Soto          293
María Díaz         253
Felipe Ruiz        252
Sergio Castro      218
Jimena Soto        147
                  ... 
Felipe Sandoval     40
Lucía Morales       37
Isabel Torres       35
Valeria Díaz        23
Laura León          20
Name: count, Length: 94, dtype: int64


Columna: position
Número de valores únicos: 15
Frecuencia de cada valor:
position
Software Developer          4164
Test Automation Engineer    1403
Quality Assurance Tester    1054
Project Manager              888
Business Analyst             803
DevOps Engineer              630
Data Analyst                 489
User Experience Designer     294
Visual Designer              294
Solutions Architect          286
Technology Consultant        255
Business Intelligence        252
Cybersecurity Specialist     252
Database Administrator       170
Product Owner                132
Name: count, dtype: int64


Columna: seniority
Número de valores únicos: 5
Frecuencia de cada valor:
seniority
Ssr           3883
Sr Level 1    3835
Sr Level 2    1934
Jr            1336
Sr Level 3     378
Name: count, dtype: int64


Columna: location
Número de valores únicos: 6
Frecuencia de cada valor:
location
AR/CABA/BA        3516
CO/CUN/BOG        2761
MX/CDMX/CDMX      1882
CL/RM/SCL         1398
CO/ANT/MED        1219
MX/JALISCO/GDL     590
Name: count, dtype: int64


Columna: studio
Número de valores únicos: 7
Frecuencia de cada valor:
studio
Engineering            4705
Quality Engineering    2457
Cloud Ops              1052
Product                 935
Delivery                888
Data                    741
Design                  588
Name: count, dtype: int64


Columna: client
Número de valores únicos: 5
Frecuencia de cada valor:
client
EduSmart Systems             3719
EcoBuild Enterprises         3027
TechNova Solutions           2431
GreenWave Innovations        1181
HealthSphere Technologies    1008
Name: count, dtype: int64


Columna: project
Número de valores únicos: 8
Frecuencia de cada valor:
project
Catalyst Program       2450
Nexus Development      2431
Vanguard Initiative    1269
Atlas Initiative       1181
Serenity Project       1135
Odyssey Quest          1009
Horizon Expansion      1008
Echo System             883
Name: count, dtype: int64


Columna: team_name
Número de valores únicos: 10
Frecuencia de cada valor:
team_name
Jurassic Bark                   1417
The Great Catsby                1301
The Matrix Mice                 1269
Breaking Badger                 1181
The Lion Kingpin                1135
Game of Tones                   1130
Star Wars: The Furry Awakens    1033
Paws and Recreation             1009
Finding Nemo's Friends          1008
Fight Club Penguin               883
Name: count, dtype: int64

Para estas variables categóricas podemos notar que varias de ellas tienen una cantidad considerable de valores únicos, como el nombre del empleado, el proyecto y el cliente. Esto sugiere que la base de datos abarca una amplia variedad de empleados y proyectos, lo cual es beneficioso para un análisis exhaustivo. Otras variables, como la posición y la ubicación, tienen menos valores únicos, lo que indica que hay categorías más definidas en estas áreas.

Análisis Exploratorio

Como parte del análisis exploratorio de estos datos decidimos considerar si realizar pruebas de hipótesis sería una buena idea.

Entendiendo las distribuciones

Para decidir si este tipo de prueba sería una buena idea comenzamos viendo la distribución de los datos de la variable de engagement que será la que intentaremos predecir más adelante.

Como se puede notar por su histograma la distribución de estos datos no es precisamente normal ya que hay demasiados valores muy bajos y muy altos (cerca de 0 y cerca de 5) además de que existe un espacio vacío en general entre 1 y 1.5 aproximadamente. Aunado a lo anterior también se puede notar que la media global del desempeño es de alrededor de 3. Ahora veremos como se distribuye esto si separamos por equipos

Con estas gráficas ya creadas se puede notar que el engagement o muy bajo o muy alto no son características de un equipo en especial a lo largo de todo el tiempo en el que se recabaron estos datos. A pesar de esto si es relevante notar que las distribuciones del engagement si cambian dependiendo del equipo del que se trata. En específico se puede notar que las medias de equipos como Breaking Badger y Star Wars: The Furry Awakens difieren bastante de la media global para el desempeño.

Ahora sería relevante encontrar si el engagement general baja en alguna fecha, para esto seccionaremos en los 12 meses del año y veremos si alguno presenta una distribución significativamente diferente.

Las distribuciones no parecen ser significativamente diferentes por mes. Aunque si existe información relevante, como que el mes con el engagement más alto en promedio es Enero donde excede 3, y que de ahí en más el promedio se ve reducido en el resto de los meses manteniendose igual o menor a 3. Esto sugiere que el engagement no se reduce significativamente.

Esto nos muestra que las pruebas de hipótesis no serían el mejor enfoque para poder entender estos datos.

Líneas de Tiempo

Cambiando el enfoque de pruebas de hipótesis, decidimos generar líneas del tiempo segmentando por equipo para ver si sus conductas cambian con el tiempo. Estas gráficas se realizaran por cada uno de los días en los que trabajo cada equipo para evitar valores nulos en la recabación y potencialmente poder agregar esta información a la base de datos. El engagement de cada equipo se considerará como el promedio del engagement de sus miembros en cualquier fecha dada.

Estas gráficas nos proporcionan un poco más de información sobre las distinciones entre los engagements de los equipos, ya que, como se puede notar en la gráfica de Finding Nemo’s Friends, The Great Catsby y Fight Club Penguin a pesar de que los promedios generales y distribuciones del engagement en los meses hayan sido muy similares se puede ver claramente que el performance promedio de estos equipo disminuye a lo largo del tiempo.

Ahora se realizará un análisis similar para una muestra de 10 personas de manera aleatoria para ver si se puede observar alguna tendencia en sus engagements personales.

Aquí se pueden notar algunos patrones bastante más obvios que muestran que el engagement en efecto decrece con el tiempo para ciertas personas. Esto se puede ver especialmente en los casos de Sofia Delgado y Ana Gómez que pertenecen a los eqipos de Finding Nemo’s Friends y Breaking Badger respectivamente. En ambos casos sus engagements decrecen de manera bastante estable y luego se estancan en un valor alrededor de 3 el cual es el valor promedio del engagement. Adicionalmente se puede notar que varios parecen no seguir mucho un patrón y simplemente oscilar en los valores altos con alguno que otro cero marcando una inasistencia para ese miembro del equipo, un ejemplo de este tipo de conducta se presenta en el caso de Natalia Ramirez y Ana Salas. Finalmente se puede encontrar otro tipo de patrón diferente en el que los valores oscilan en los números altos, luego bajan por un periodo de tiempo y finalmente suben otra vez, esto se puede ver en los casos de Alberto Bravo y Paula Cordero. Estos patrones sugieren que no existe un patrón general para el engagement en todos los empleados y que un modelo sería mejor si intenta predecir los engagements personales.